/**
 * @see https://schema.org/Person
 */

export interface PersonSchema extends Record<string, unknown> {
  '@type': 'Person'

  /**
   * Person name
   */
  'name': string

  /**
   * Person URL
   * @recommended
   */
  'url'?: string
}

/**
 * @see https://schema.org/CreativeWork
 *
 * @tutorial https://developers.google.com/search/docs/appearance/structured-data/article#structured-data-type-definitions
 */
export interface CreativeWorkSchema extends Record<string, unknown> {
  '@type': 'CreativeWork'

  /**
   * An abstract is a short description that summarizes a CreativeWork
   */
  'abstract'?: string

  /**
   * The author of this content or rating
   */
  'author': PersonSchema[]

  /**
   * Text of a notice appropriate for describing the copyright aspects of this Creative Work, ideally indicating the owner of the copyright for the Work
   */
  'copyrightNotice'?: string

  /**
   * Article title
   *
   * @description No more than 110 characters
   */
  'headline': string

  /**
   * @recommended
   */
  'datePublished'?: string
  /**
   * @recommended
   */
  'dateModified'?: string

  'wordCount'?: number
}

/**
 * @see https://schema.org/Article
 *
 * @tutorial https://developers.google.com/search/docs/appearance/structured-data/article#structured-data-type-definitions
 */
export interface ArticleSchema extends Omit<CreativeWorkSchema, 'type'> {
  '@context': 'https://schema.org'
  '@type': 'Article'
}

/**
 * @see https://schema.org/BlogPosting
 *
 * @tutorial https://developers.google.com/search/docs/appearance/structured-data/article#structured-data-type-definitions
 */
export interface BlogPostingSchema extends Omit<ArticleSchema, 'type'> {
  '@context': 'https://schema.org'
  '@type': 'BlogPosting'
}

/**
 * @see https://schema.org/WebPage
 */
export interface WebPageSchema extends Omit<CreativeWorkSchema, 'type'> {
  '@context': 'https://schema.org'
  '@type': 'WebPage'

  'name'?: string
  'description'?: string
}
